package www.study.com;

//外观数列 https://leetcode.cn/problems/count-and-say/
public class code38 {
    public static void main(String[] args) {

    }

    class Solution {

        //方式二：
        public String countAndSay(int n) {
            if(n == 0) return "";
            String s = "1";
            for(int i = 2 ; i <= n ; i++){
                s = func(s);
            }
            return s;
        }
        public String func(String s){
            StringBuilder sb = new StringBuilder();
            int le = 0,rg = 0;
            while(rg < s.length()){
                while(rg < s.length() && s.charAt(rg) == s.charAt(le)) rg++;
                sb.append(rg - le);
                sb.append(s.charAt(le));
                le = rg;
            }
            return sb.toString();
        }

        //方式一：
        // public String countAndSay(int n) {
        //     /**
        //     提速方式：
        //     1.字符串拼接用StringBuilder
        //     2.便历String转成便利char[]
        //     3.打表4
        //      */
        //     switch(n){
        //         case 1:
        //             return "1";
        //         case 2:
        //             return "11";
        //         case 3:
        //             return "21";
        //         case 4:
        //             return "1211";
        //         case 5:
        //             return "111221";
        //         case 6:
        //             return "312211";
        //         case 7:
        //             return "13112221";
        //     }
        //     char[] base = "1".toCharArray();
        //     for(int i = 1 ; i < n ; i++){
        //         StringBuilder tmpStr = new StringBuilder();
        //         int cnt = 0;
        //         char pre = '.';
        //         for(int j = 0 ; j < base.length ; j++){
        //             if(j == 0){
        //                 pre = base[0];
        //                 cnt = 1;
        //             }
        //             else if(j > 0 && base[j] == base[j - 1]){
        //                 cnt++;
        //             }else{
        //                 tmpStr.append(cnt);
        //                 tmpStr.append(pre);
        //                 pre = base[j];
        //                 cnt = 1;
        //             }
        //         }
        //         tmpStr.append(cnt);
        //         tmpStr.append(pre);
        //         base = tmpStr.toString().toCharArray();
        //     }
        //     return String.valueOf(base);
        // }
    }
}
